我偶然发现了一个我无法理解的低级Python问题。我想对函数中的字符串执行某些操作并保留这些更改。
name = 'name'
def get_new_name(name):
name = 'new_name'
get_new_name(name)
print(name) # expected 'new_name', got 'name'
我希望我会打印new_name
,但结果是name
。
我知道我可以通过在函数中使用return来获得我想要的东西,但是我可以以某种方式使用像这里描述的类似void的函数来获得我想要的东西吗?
答案 0 :(得分:4)
你不能在python中修改不可变对象,没有。任何重新分配都不会修改原始对象,只是更改变量指向的引用。
使用可变对象,您可以修改它 contents ,当通过指向它的任何变量/引用访问对象时,将会看到更改。
理解对象和引用之间的区别是理解这一点的关键。
因为你很想知道这是否可能......这是!但是只有才能将你的字符串包装在其他内容中,例如dict
。
def get_new_name(d):
d['name'] = 'new_name'
name = 'name'
d = {'name' : name}
get_new_name(d)
name = d['name']
print(name)
'new_name'
您还需要决定您和函数达成一致的协议,以便彼此之间的顺畅沟通。
当然,您也可以使用global
变量,但您的问题并非如此......我也不建议这样做 - 这是创建不纯函数的不良做法。
答案 1 :(得分:2)
不要将name
传递给函数,并更改全局函数的值。但不推荐......
def get_new_name():
global name
name = 'new_name'
答案 2 :(得分:2)
void函数中的名称变量只是本地的,并且与全局变量名称的共享范围不同。函数完成运行后,它会丢弃带有“new_name”的局部变量。除非你在函数中包含print语句,这是非常多余的。
答案 3 :(得分:1)
如果您只想访问全局变量,只需使用其名称即可。 但要更改其值,您需要使用
global
关键字。