在元组类中使用“ __add__”方法

时间:2019-06-17 14:58:38

标签: python tuples

python noob在这里玩弄元组和列表的限制。

我没有问题,只是一个关于Tuple类和/或一般情况下__methodname__方法使用情况的常规查询。

我知道您不能修改元组,为此,您必须将其转换为列表,修改所述列表,然后再转换回元组,但是我在玩__add__方法并发现它有效。用它来创建新的元组并修改现有元组有什么问题和局限性?

代码:

myTuple = ('item1', 2, 'item3', ['list1', 'list2'])
tupleModification = myTuple.__add__(('newTupleItem1','newTupleItem2'))

这将输出以下内容:

('item1', 2, 'item3', ['list1', 'list2'], 'newTupleItem1', 'newTupleItem2')

这是正确的,但是我想知道我是否在玩火,因为我还没有看到有关修改元组的任何解决方案。

编辑:我知道您不能修改现有的元组,并且这将创建一个新的实例。我想我可能会对人们的命名约定感到困惑。

4 个答案:

答案 0 :(得分:6)

__add__是您执行以下操作时所调用的方法:

myTuple + ('newTupleItem1','newTupleItem2')

因此,这不会修改myTuple,而是创建一个新的tuple,其内容是与myTuple串联的('newTupleItem1', 'newTupleItem2')的内容。

您可以打印myTuple来查看它是否已被修改:

>>> myTuple
('item1', 2, 'item3', ['list1', 'list2'])

您可以检查myTupletupleModification不是同一对象:

>>> myTuple is tupleModification
False

答案 1 :(得分:4)

您不能修改元组,是的。但是,您可以将两个现有的元组连接成一个新的元组。这是通过+运算符完成的,该运算符又调用__add__方法。生成的元组将不是任何原始元组的“修改”,而是新的独特元组。这就是您发布的代码的作用。简而言之,您可以这样做:

myTuple = ('item1', 2, 'item3', ['list1', 'list2'])
tupleModification = myTuple + ('newTupleItem1','newTupleItem2')
print(tupleModification)
# ('item1', 2, 'item3', ['list1', 'list2'], 'newTupleItem1', 'newTupleItem2')

编辑:为澄清起见,您无法以任何方式“编辑”一个元组,即从其中添加或删除元素,或更改其内容。但是,如果您的元组包含可变对象(例如列表),则可以修改该内部对象:

myTuple = (1, [2, 3])
myTuple[1].append(4)
print(myTuple)
# (1, [2, 3, 4])

答案 2 :(得分:2)

我认为,从根本上来说,您对于通过修改创建新对象(在这种情况下为__add__与修改现有对象(例如extend)之间的区别感到困惑。

__add__

正如已经提到的其他答案一样,__add__方法实现了+运算符,并返回一个新对象。元组和列表每个都有一个。例如:

>>> tuple_0 = (1,)
>>> tuple_1 = tuple_0.__add__((2,))
>>> tuple_1 is tuple_0
False
>>> 
>>> list_0 = [1]
>>> list_1 = list_0.__add__([2])
>>> list_1 is list_0
False

extend

可变的列表具有extend方法,该方法修改现有对象并返回None。不可变的元组不是。例如:

>>> list_2 = [4, 5, 6]
>>> id_save = id(list_2)
>>> list_2.extend([7])
>>> id(list_2) == id_save
True
>>> 
>>> tuple_2 = (4, 5, 6)
>>> tuple_2.extend([7])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'extend'

列表还有其他更改现有对象的方法,例如appendsortpop等,但是extend__add__最相似

答案 3 :(得分:0)

1)修改现有的元组(就地)与2)保留原始元组,但创建新的修改后的副本之间有区别。这两个不同的范例可以在整个计算机编程中看到,而不仅仅是python元组。例如,考虑将数字加1。您可以修改原件,也可以将原件留在原处,创建副本,然后修改副本。

MODIFYING IN-PLACE
BEFORE:
     x == 5
AFTER:
     x == 6

CREATING A MODIFIED COPY
BEFORE:
    x == 5
AFTER:
    x == 5 (unchanged)
    y == 6

tuple.__add__连接元组。例如,(x, y) + (a, b, c)返回(x, y, a, b, c)

tuple.__add__不会修改原始元组。它不理会原始的元组,并创建一个新的元组,它是原始的两个元组的串联。这与list.appendlist.extend之类的东西相反,后者修改原始列表而不返回修改后的副本。

元组方法通常执行以下操作:

  1. 复制原件
  2. 以某种方式修改副本
  3. 将原件留空。