没有return语句的函数内部的任何更改都应该无法访问对吗?(如果我错了,请纠正我),但是这段代码给出的输出没有return语句
def my_fun(a):
a[0] = 'new value:'
a[1] = a[1] + 1
x = ['old value:', 99]
my_fun(x)
print (x[0], x[1])
我只是运行了这段代码,就把 新值:100 我正在使用python 3.6。还能在其他任何编程语言中使用吗?
答案 0 :(得分:1)
您将 mutable 参数a
(或x
)传递给函数list
。然后您修改列表内容。这当然会更改您的列表x
。
如果您想保护x
不被修改,可以将其定义为元组
x = ("old value:", 99)
现在调用my_fun(x)
将导致TypeError
(因为分配将失败)。
在函数外部的变量在函数外部不可见。
答案 1 :(得分:0)
在Python中,参数是通过引用传递的,这意味着对它们的任何修改都将在调用后保留。但是,重新分配对象会更改引用的目标,并且无法保留任何后续修改。 考虑以下示例:
def foo(bar):
bar[0] = 2 # modification
bar = [] # reassigment
x = [1]
print(x)
foo(x)
print(x)
这将输出:
[1] [2]
一些对象,例如元组或整数,是不可变的,这意味着它们不能被修改,并且在尝试时会引发异常。必须重新分配它们才能对其进行修改。
这是特定于Python的。 Java以表面上类似的方式运行,但是实现方式却大不相同:对象通过引用传递并进行修改,而简单数据类型(int
,double
,char
等) )被复制,并且修改不会保留。 C和C ++永远不会修改对象,保留对象修改的唯一方法是将对象上的指针传递给函数。