Python 调用方如何准确地看到对象中的更改?
来自官方Python教程的第页: […]如果函数修改作为参数传递的对象,调用方将看到更改-这消除了对两种不同参数传递机制(如Pascal)的需要 打电话的人如何确切地看到变化的例子是什么?或者调用方怎么可能(不是在Python中,而是在一般情况下)看不到更改 打电话的人如何确切地看到变化的例子是什么 或者调用方怎么可能(不是在Python中,而是在一般情况下)看不到更改 假设存在一种语言,其中创建了Python 调用方如何准确地看到对象中的更改?,python,function,object,Python,Function,Object,来自官方Python教程的第页: […]如果函数修改作为参数传递的对象,调用方将看到更改-这消除了对两种不同参数传递机制(如Pascal)的需要 打电话的人如何确切地看到变化的例子是什么?或者调用方怎么可能(不是在Python中,而是在一般情况下)看不到更改 打电话的人如何确切地看到变化的例子是什么 或者调用方怎么可能(不是在Python中,而是在一般情况下)看不到更改 假设存在一种语言,其中创建了seq的深度副本并将其分配给x,对x所做的任何更改都不会影响seq,在这种情况下,print(se
seq
的深度副本并将其分配给x
,对x
所做的任何更改都不会影响seq
,在这种情况下,print(seq)
将同时显示[]
。但Python中并不是这样
编辑:请注意,将新值指定给旧变量名通常不算作“修改”
这基本上意味着,如果一个可变对象发生了变化,它将在任何地方发生变化 以引用传递为例(Python就是这样做的): 与Pascal类似,您可以将对象的副本作为参数传递,而不是对象本身:
# Pretend this is Pascal code.
x = []
def foo_adder(y):
y.append('foo')
foo_adder(x)
print(x) # []
如果传递对象的副本,则可以在Python中获得第二个示例的行为。对于列表,可以使用[:]
# Pretend this is Pascal code.
x = []
def foo_adder(y):
y.append('foo')
foo_adder(x[:])
print(x) # []
关于调用者如何看不到更改的第二个问题,让我们使用相同的foo_adder
函数对其进行一点更改,使其不会修改对象,而是替换它
x = []
def foo_adder(y):
y = y + ['foo']
foo_adder(x)
print(x) # []
@我不知道你在说什么(感谢您指出这一点)。即使您正在分配给当前包含可变对象的标识符,本地分配在其当前范围之外也不可见。假设函数没有执行
x=x+[1]
。然后z=[];f(z);打印(z)
将打印[]
,即使列表是可变的。
# Pretend this is Pascal code.
x = []
def foo_adder(y):
y.append('foo')
foo_adder(x)
print(x) # []
# Pretend this is Pascal code.
x = []
def foo_adder(y):
y.append('foo')
foo_adder(x[:])
print(x) # []
x = []
def foo_adder(y):
y = y + ['foo']
foo_adder(x)
print(x) # []