Я думал, что я понял область переменной Python довольно хорошо, но затем я столкнулся с этим кодом сегодня.Strange Python Scope Issue
from __future__ import print_function
def main():
v_Matrix =[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
print(v_Matrix)
print()
f_Rotate(v_Matrix)
print(v_Matrix)
hh = 3
f_This(hh)
print(hh)
def f_Swap(v_Matrix, r1, c1, r2, c2):
v_Matrix[r1][c1], v_Matrix[r2][c2] = v_Matrix[r2][c2], v_Matrix[r1][c1]
def f_Transpose(v_Matrix):
for row in range(len(v_Matrix)):
for col in range(row):
f_Swap(v_Matrix, row, col, col, row)
def f_FlipVertical(v_Matrix):
v_Size = len(v_Matrix)
for row in range(v_Size // 2):
for col in range(v_Size):
f_Swap(v_Matrix, row, col, v_Size - row - 1, col)
def f_Rotate(v_Matrix):
f_Transpose(v_Matrix)
f_FlipVertical(v_Matrix)
def f_This(hh):
hh = hh * 2
if __name__ == '__main__':
main()
При запуске, переменная v_Matrix
, кажется, ведут себя, как если бы глобальный характер. Однако тестовая переменная hh
ведет себя как ожидалось с одной областью в main()
, а другая в f_This
.
v_Matrix
не является глобальным, модифицируется в различных функциях, но не передается между этими функциями и даже возвращается к main()
. Тем не менее изменения значений, применяемые к v_Matrix
в этих функциях, доступны в области main()
, как видно из выходов. Однако, как и ожидалось, значение тестовой переменной hh
не изменяется в области main()
, только в рамках функции.
Что дает?
Это потому, что списки изменчивы. Для подробного обсуждения см. Https://docs.python.org/2/reference/datamodel.html#objects-values-and-types. – Selcuk
И Python передает указатель на изменяемый объект в качестве параметра при вызове функции, а не на создание копии объекта. Как и в указателях типа C, вы можете изменить содержимое объекта, на который указана, но не может заставить вызывающего объекта указать новый объект, назначив его. –
@Selcuk Хорошо, мало упоминалось о сфере видимости в вашей ссылке. Тем не менее, ваш комментарий помог мне указать на то, что изменяемые объекты, особенно списки, имеют другое поведение в отношении области, основанной на «внешних», «против» внутренних контейнерах и т. Д. Я все еще не понимаю все это, но я буду , Наверное, я пропустил этот факт, когда изучил масштаб. Спасибо. – JayJay123