繁体   English   中英

呼叫者如何确切地看到对象的变化?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM