Python 调用方如何准确地看到对象中的更改?

Python 调用方如何准确地看到对象中的更改?,python,function,object,Python,Function,Object,来自官方Python教程的第页: […]如果函数修改作为参数传递的对象,调用方将看到更改-这消除了对两种不同参数传递机制(如Pascal)的需要 打电话的人如何确切地看到变化的例子是什么?或者调用方怎么可能(不是在Python中,而是在一般情况下)看不到更改 打电话的人如何确切地看到变化的例子是什么 或者调用方怎么可能(不是在Python中,而是在一般情况下)看不到更改 假设存在一种语言,其中创建了seq的深度副本并将其分配给x,对x所做的任何更改都不会影响seq,在这种情况下,print(se

来自官方Python教程的第页:

[…]如果函数修改作为参数传递的对象,调用方将看到更改-这消除了对两种不同参数传递机制(如Pascal)的需要

打电话的人如何确切地看到变化的例子是什么?或者调用方怎么可能(不是在Python中,而是在一般情况下)看不到更改

打电话的人如何确切地看到变化的例子是什么

或者调用方怎么可能(不是在Python中,而是在一般情况下)看不到更改

假设存在一种语言,其中创建了
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)  # []