Python不可变函数参数

Python不可变函数参数,python,object,variable-assignment,Python,Object,Variable Assignment,我试图理解Python的核心思想,我读到了一篇很好的文章,解释了如何将参数引用传递给对象。比如, def add_to_list(list_to_add, value): list_to_add.append(value) 将能够在添加参数时将原始列表更改为添加参数 def change_list(list_to_add): list_to_add = [1, 2, 3, 5] 我什么都不会做 我目前正在编写一个基本的链表打印函数,它就像 class Node: def __in

我试图理解Python的核心思想,我读到了一篇很好的文章,解释了如何将参数引用传递给对象。比如,

def add_to_list(list_to_add, value):
  list_to_add.append(value)
将能够在添加参数时将原始列表更改为添加参数

def change_list(list_to_add):
  list_to_add = [1, 2, 3, 5]
我什么都不会做

我目前正在编写一个基本的链表打印函数,它就像

class Node:
  def __init__(self, val, next=None):
    self.val = val
    self.next = next

root = Node(2, Node(3, Node(4, Node(5, Node(6)))))

def print_list(root):
  while root:
    print root.val,
    root = root.next
  print ''
你猜对了。它没有改变根的值。现在我的问题是这是怎么发生的。这是因为python类是不可变的吗?

很简单:

obj.do_something()
对传递的对象进行操作,可能会对其进行修改(例如
list\u to\u add.append()
),而

放弃对旧对象的引用并使用其他对象

对象上的更改(当然)对对象的“其他”用户可见,而重新分配只影响重新定义对象的位置。

很简单:

obj.do_something()
对传递的对象进行操作,可能会对其进行修改(例如
list\u to\u add.append()
),而

放弃对旧对象的引用并使用其他对象


对象上的更改(当然)对对象的“其他”用户是可见的,而重新分配只影响重新定义它的位置。

Python类当然不是不变的。您可以随意更改它们(对于一些涉及扩展类型或插槽的拐角案例

但是,这里要做的是定义一个模块级(全局)变量根,然后在print_列表中定义一个参数名root

调用print_list(root)然后将某些内容分配给root不会改变模块级别的全局设置

如果您想这样做(您不应该这样做,但这是关于避免全局变量的不同讨论),您必须将print_列表中的root声明为全局

def print_list():
    global root
    ...
然后就不需要参数了

再说一遍:不要这样做


如果您使用pylint之类的工具来检查代码,它应该警告您,参数名“root”隐藏了模块全局名“root”。

Python类当然不是不可变的。您可以随意更改它们(对于一些涉及扩展类型或插槽的拐角案例

但是,这里要做的是定义一个模块级(全局)变量根,然后在print_列表中定义一个参数名root

调用print_list(root)然后将某些内容分配给root不会改变模块级别的全局设置

如果您想这样做(您不应该这样做,但这是关于避免全局变量的不同讨论),您必须将print_列表中的root声明为全局

def print_list():
    global root
    ...
然后就不需要参数了

再说一遍:不要这样做


如果您使用pylint之类的工具检查代码,它应该警告您,参数名“root”会隐藏模块全局名“root”。

非常感谢您的描述性回答。非常感谢您的描述性回答。非常感谢您的贡献。非常感谢您的贡献。非常感谢您的贡献