python noob在这里玩弄元组和列表的限制。
我没有问题,只是一个关于Tuple类和/或一般情况下__methodname__
方法使用情况的常规查询。
我知道您不能修改元组,为此,您必须将其转换为列表,修改所述列表,然后再转换回元组,但是我在玩__add__
方法并发现它有效。用它来创建新的元组并修改现有元组有什么问题和局限性?
代码:
myTuple = ('item1', 2, 'item3', ['list1', 'list2'])
tupleModification = myTuple.__add__(('newTupleItem1','newTupleItem2'))
这将输出以下内容:
('item1', 2, 'item3', ['list1', 'list2'], 'newTupleItem1', 'newTupleItem2')
这是正确的,但是我想知道我是否在玩火,因为我还没有看到有关修改元组的任何解决方案。
编辑:我知道您不能修改现有的元组,并且这将创建一个新的实例。我想我可能会对人们的命名约定感到困惑。
答案 0 :(得分:6)
__add__
是您执行以下操作时所调用的方法:
myTuple + ('newTupleItem1','newTupleItem2')
因此,这不会修改myTuple
,而是创建一个新的tuple
,其内容是与myTuple
串联的('newTupleItem1', 'newTupleItem2')
的内容。
您可以打印myTuple
来查看它是否已被修改:
>>> myTuple
('item1', 2, 'item3', ['list1', 'list2'])
您可以检查myTuple
和tupleModification
不是同一对象:
>>> 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'
列表还有其他更改现有对象的方法,例如append
,sort
,pop
等,但是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.append
或list.extend
之类的东西相反,后者修改原始列表而不返回修改后的副本。
元组方法通常执行以下操作: