[英]How exactly does the caller see a change in the object?
在官方Python教程的“类”一章中 :
[...]如果函数修改了作为参数传递的对象,则调用者将看到更改-这样就无需使用Pascal中的两种不同的参数传递机制。
呼叫者将如何准确看到更改的示例将是什么? 或调用者看不到更改怎么可能(不是在Python中而是在一般情况下)?
呼叫者将如何准确看到更改的示例将是什么?
>>> def modify(x):
... x.append(1)
...
>>> seq = []
>>> print(seq)
[]
>>> modify(seq)
>>> print(seq)
[1]
或调用者看不到更改怎么可能(不是在Python中而是在一般情况下)?
假设地,可能存在一种语言,其中将创建seq
的深层副本并将其分配给x
,并且对x
所做的任何更改都不会对seq
产生影响,在这种情况下, print(seq)
会两次显示[]
。 但这不是Python中发生的事情。
编辑:请注意,将新值分配给旧变量名称通常不算作“修改”。
>>> def f(x):
... x = x + 1
...
>>> y = 23
>>> f(y)
>>> print(y)
23
从根本上讲,这意味着如果更改了可变对象,它将在任何地方更改。
有关通过引用传递的示例(Python就是这样做的):
x = []
def foo_adder(y):
y.append('foo')
foo_addr(x)
print(x) # ['foo']
与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) # []
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.