在void函数中更改字符串

时间:2017-11-05 11:27:25

标签: python python-3.x function

我偶然发现了一个我无法理解的低级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的函数来获得我想要的东西吗?

4 个答案:

答案 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关键字。

来自https://stackoverflow.com/a/10588342/6225257