4 回答
TA贡献1793条经验 获得超6个赞
我认为最好在此类问题中保持简单。
您问题中的第二个链接是一个很好的解释。总之:
方法带有参数,如在该说明中指出的那样,这些参数是“按值”传递的。函数中的参数采用传入的变量的值。
对于诸如字符串,整数和浮点数之类的原始类型,变量的值是指向内存中代表数字或字符串的空间的指针(下图中的箭头)。
code | memory
|
an_int = 1 | an_int ----> 1
| ^
another_int = 1 | another_int /
在方法中重新分配时,将更改箭头指向的位置。
an_int = 2 | an_int -------> 2
| another_int --> 1
数字本身不会改变,并且由于这些变量仅在函数内部,函数外部才具有作用域,因此传入的变量与之前相同:1和1。但是,当您传入列表或对象时,例如,您可以更改它们指向函数外部的值。
a_list = [1, 2, 3] | 1 2 3
| a_list ->| ^ | ^ | ^ |
| 0 2 3
a_list[0] = 0 | a_list ->| ^ | ^ | ^ |
现在,您可以更改列表或对象中的箭头指向的位置,但是列表的指针仍然指向与以前相同的列表。(在上图中,两组箭头实际上实际上应该只有一个2和3,但是绘制箭头会变得很困难。)
那么实际的代码是什么样的呢?
a = 5
def not_change(a):
a = 6
not_change(a)
print(a) # a is still 5 outside the function
b = [1, 2, 3]
def change(b):
b[0] = 0
print(b) # b is now [0, 2, 3] outside the function
是否复制给定的列表和对象(int和字符串无关紧要),然后返回新变量还是更改传入的变量,取决于您需要提供的功能。
TA贡献1780条经验 获得超1个赞
如果要重新绑定名称,则它包含的对象的可变性是无关紧要的。仅当执行变异操作时,才必须创建副本。(而且,如果您在两行之间阅读,则会间接说“不要使传递给您的对象发生变异”。)
添加回答
举报