关于对象:Python不可变函数参数

Python immutable function parameter

本问题已经有最佳答案,请猛点这里访问。

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

1
2
def add_to_list(list_to_add, value):
  list_to_add.append(value)

将原始列表更改为添加参数;

1
2
def change_list(list_to_add):
  list_to_add = [1, 2, 3, 5]

什么都不会做。

我目前正在编写一个基本的链表打印功能,它很简单;

1
2
3
4
5
6
7
8
9
10
11
12
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类是不可变的吗?


Python的类是不是一定不变的。你可以把你喜欢的漂亮的大的变化(与一些案件涉及的任何类型的扩展角或槽)。

然而,你是你的定义在模块级(全局)的可变参数的根,根,然后在打印_名称列表。

_ invoking打印表(根),然后到根assigning什么将不改变模块的整体水平。

如果你想说你不想说,但这是不同的讨论关于避免全局变量),你要把根D是在全球_列表打印

1
2
3
def print_list():
    global root
    ...

然后你需要的参数。

一:不要这样!!!!!!!!!!!!!!!

如果你会使用工具来检查你的代码像Pylint warned,它应该有一个你的参数名称是"根"的阴影模块全局名称的"根"。


它是简单的:

1
obj.do_something()

在对象的操作中,可能影响它(例如,在list_to_add.append())

1
obj = something_other

《老discards参考对象和使用不同的一个。

在一个变化的对象将是可见的(当然)到用户的"其他"的对象,而只影响的重新分配的地方,它是redefined。