精华内容
下载资源
问答
  • 众所周知,tuple与list的区别就是...但tuple是完全可变的,如下所示,tuple中的list的元素就是可以修改的。 >>> a = 1 >>> b = 2 >>> c = [3,4,5] >>> d = (a,b,c)...

    众所周知,tuple与list的区别就是tuple是不可变的,是为了让程序更安全,tuple可以当作dict的key但是list不行。但tuple并不是完全不可变的,如下所示,tuple中的list的元素就是可以修改的。

    >>> a = 1
    >>> b = 2
    >>> c = [3,4,5]
    >>> d = (a,b,c)
    >>> d
    (1, 2, [3, 4, 5])
    >>> d[2][0]=9
    >>> d
    (1, 2, [9, 4, 5])

    首先我们需要了解python中list的一些特性:

    >>> c
    [9, 4, 5]
    >>> c2 = c # 使用=定义一个新的list,实际上c2只是c的一个引用,修改c2中的元素,c也会同时被修改
    >>> c2
    [9, 4, 5]
    >>> c2[0]= 99
    >>> c
    [99, 4, 5]
    >>> id(c)
    1868306709960
    >>> id(c2) # 发现c2和c的id是一样的,即二者的地址相同
    1868306709960
    >>> c3 = [99, 4, 5]  # 定义一个新的c3,元素组成与c2一样,不过此时虽然二者内容相等,但却是不同的list对象,占用的内存地址不同
    >>> c3 == c2  # == 只判断值是否相等
    True
    >>> c3 is c2  # is判断内存地址是否相同
    False
    >>> id(c3)  # 发现c3的id与c2不同
    1868306685576
    
    >>> id(c3[0])  # 查看c3里第一个元素的id
    1885009424
    >>> c3[0]=999  
    >>> id(c3[0])  # 修改c3[0]的值后,其id也随之改变,但是c3的地址不会发生改变
    1868273844016
    >>> id(c3)
    1868306685576

    看完以上的代码,我们基本就能明白tuple中list中元素可变的原因:虽然list中的元素变了,但是list对象本身的内存地址并没有变,所以对tuple来说并没有元素发生变化。那么能否将list整体替换呢?理论上是不可行的,因为替换list本身会修改对象内存地址。看以下演示

    >>> d
    (1, 2, [99, 4, 5])
    >>> d[2] = 3  # 不可将list整体替换
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'tuple' object does not support item assignment
    >>> d[2]=c2  # 即使是将list整体替换成内存地址相同的对象也不可以,python直接不允许这种操作,以避免错误操作
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'tuple' object does not support item assignment

    c++里的参数传递允许传递引用和指针(所以C++难呀),而在python里,参数的传递是传递对象引用

    在python中,不可改变的对象有:str,int,float,tuple;可以改变的对象有list,dict,set。可变和不可变实际上指的是对象所占用的内存地址是否可变。下面以str和list演示可变和不可变的区别。

    >>> x = 'abc'
    >>> type(x)
    <class 'str'>
    >>> y = ['a', 'b', 'c']
    >>> type(y)
    <class 'list'>
    >>> x2 = 'abc'  # 定义一个新的x2
    >>> y2 = ['a', 'b', 'c']
    >>> id(x), id(x2)  # 比较两个内容相同的str的id,发现他们所占用的内存地址相同,
    (1868273892576, 1868273892576)
    >>> id(y), id(y2)  # 比较两个内容相同的list的id,发现不同
    (1868306709832, 1868306709768)
    
    >>> x3 = x  # 将x值赋给x3,此时二者占用的是同一个内存地址,相当于引用
    >>> x3
    'abc'
    >>> x3 += 'd'  # 修改x3时,由于x是str类型不可变,所以x并不会跟着变,x3此时实际上是调用了新的内存地址
    >>> x3
    'abcd'
    >>> x
    'abc'
    >>> y3 = y   # 对于list正相反
    >>> y3
    ['a', 'b', 'c']
    >>> y3.append('d')
    >>> y3
    ['a', 'b', 'c', 'd']
    >>> y
    ['a', 'b', 'c', 'd']
    >>> y2
    ['a', 'b', 'c']

     int和float类型和str一样,dict和list一样,不过tuple虽然是不可变的,但和str不完全一样:

    >>> n = (1,2,3)
    >>> m = (1,2,3)
    >>> id(n), id(m)  # 虽然tuple是不可变的,但是内容相同的两个tuple地址是不一样的,这和list类似。
    (1868306704208, 1868306704424)

     

    展开全文
  • 3、更支持修改元素修改操作的步骤是:先删除、再添加)【】 4、Tuple支持两种【查】 a、根据下标Get元素,一般称为【访问】元素,时间复杂度为O(1) b、根据值Get元素,一般称为【查找】元素,时间复杂度...

    标题误导了各位,我是故意这样做的…抱歉

    一个tuple对象第一次创建后,再也无法原地改变自身持有的元素!希望大家记住这个知识点,所以才用标题误导大家进来!

     

    tuple的特点

    1、不支持添加元素【增】

    2、不支持删除元素【删】

    3、不支持修改元素(修改操作的步骤是:先删除、再添加)【改】

    4、支持2种查找元素【查】

    a、根据下标查找元素,常称为【访问】元素,时间复杂度为O(1)

    b、根据元素获取下标,常称为【查找】元素,时间复杂度为O(n)

     

    举例

    创建一个持有4个元素(4个字符串对象)的tuple对象赋值给变量temp,此时你无法原地改变此tuple对象持有的元素!

    如果你想从temp指向的tuple对象中查找元素,请这样做:

    1、根据下标查找元素:temp[0]

    2、根据元素获取下标:temp.index("wang")

    …………………………跟着敲一遍上面举例的代码……………加深对Tuple的记忆………………………

    创建元组------>创建元组

    遍历元素------>tuple遍历元素

    展开全文
  • 如何改变tuple元素

    2021-09-06 10:09:27
    # The only way to modify tuple is to convert it to array/list and then back to tuple temp_list = list(some_tuple) temp_list[1] = 123 some_tuple = tuple(temp_list) some_tuple list() tuple()
    # The only way to modify tuple is to convert it to array/list and then back to tuple
    temp_list = list(some_tuple)
    temp_list[1] = 123
    some_tuple = tuple(temp_list)
    some_tuple
    

    list()
    tuple()

    展开全文
  • Python元组tuple到底能修改

    万次阅读 2018-12-15 11:40:31
    最近在看wtfPython——一些奇怪的python特性,发现了一些以前不曾意识到的问题(大概是自己太菜了吧,hhh),这里就列举了一个元组能修改。虽然元组的定义是可改变的,但慢慢看完文章,你会有新发现的 看下...

    最近在看wtfPython——一些奇怪的python特性,发现了一些以前不曾意识到的问题(大概是自己太菜了吧,hhh),这里就列举了一个元组能不能修改。虽然元组的定义是不可改变的,但慢慢看完文章,你会有新发现的

    看下下面这个问题

    >>> some_tuple = ([1],[2],[3])
    >>> some_tuple[0] += [2]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'tuple' object does not support item assignment
    >>> some_tuple
    ([1, 2], [2], [3])
    
    >>> some_tuple[0] = [2]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'tuple' object does not support item assignment
    >>> some_tuple
    ([1, 2], [2], [3])
    

    没错,tuple确实被修改了,虽然是抛出了异常,但下面有个例子不会抛出异常修改元组

    不可变序列 不可变序列的对象一旦创建就不能再改变. (如果对象包含对其他对象的引用,则这些其他对象可能是可变的并且可能会被修改; 但是,由不可变对象直接引用的对象集合不能更改.)

    没错,不可变的tuple确实报了错(tuple不支持修改),但是使用+=时,确实改变了tuple

    +=回原地修改可变对象,而tuple中+=是两个过程,先+=,所以+操作时已经修改了原对象,但是再次赋值就触犯了元组不能修改规则,抛出异常

    首先需要重温+=这个运算符,如a+=b:

    • 对于可变对象(mutable object)如list, +=操作的结果会直接在a对应的变量进行修改,而a对应的地址不变.
    • 对于不可变对象(imutable object)如tuple, +=则是等价于a = a+b 会产生新的变量,然后绑定到a上而已.

    参考这个:Python中tuple+=赋值的四个问题

    >>> a = some_tuple[0]
    >>> id(a)
    1833459936
    >>> a += [3]
    >>> a
    [1, 2, 3]
    >>> id(a)
    1833459936
    >>> some_tuple
    ([1, 2, 3], [2], [3])
    >>> id(some_tuple[0])
    1833459936
    

    所以元组到底可不可变?从上面可以看到tuple不支持=这种assign操作,但是对其中可变元素的原地修改是可以的

    +=, -=, =, /=, //=, %=, *=, <<=, >>=, &=, ^=, |=这些操作符都是原地修改可变对象,不会改变对象

    所以,tuple元组的不可变是指元素对象的引用不可变,不能对其再次赋值,但是在其中可变元素对象的引用不被修改前提下,仍旧可以对可变元素对象修改

    部分参考如下:

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lzw2016/article/details/85012814

    展开全文
  • 元组元素不能被修改

    千次阅读 2019-09-27 19:09:58
    v1 = (11,22,33) v1[0] = 666 错误 v1 = (11,(22,33),44) v1 = (11,22,33,[44,55,66]) v1[-1][1] = 666 v1=[11,22,(33,44,55)] v1[-1] = 666 转载于:https://www.cnblogs.com/heruxiu/p/1089003...
  • 元组tuple修改问题 += 操作

    千次阅读 2019-08-08 17:53:30
    最近在看wtfPython——一些奇怪的python特性,发现了一些以前不曾意识到的问题(大概是自己太菜了吧,hhh),这里就列举了一个元组能修改。虽然元组的定义是可改变的,但慢慢看完文章,你会有新发现的 看下...
  • C++11::遍历tuple中元素

    千次阅读 2015-11-16 16:43:57
    pair对象的成员遍历十分简单,如何进行tuple成员的遍历呢? 对tuple的成员进行遍历时,存在哪些常见的错误或者陷阱? 又为什么会牵涉到c++模板的根本设计问题? 如何对tuple进行索引?
  • 支持对元组的增删! 想要改变元组内元素,一般都是先取出元组内的元素,再进行拼接,最终生成一个新元组;删除元组内元素也是同样的处理方式;
  • Python元组中元素怎么删除和修改

    千次阅读 2020-09-01 08:18:00
    修改元组元素 我们直接在同一个元组上更新是可行的,但是可以通过拷贝现有的元组片段构造一个新的元组的方式解决。 我们通过切片的方法让元组拆分成两部分,然后再使用连接操作符+合并成一个新元组,最后将...
  • #1、需求,需要将listb满足等于lista的元素都替换为某个18位的随机整型,并且必须保证listb相同的变量替换为相同的随机值 初始列表如下: lista=['aaaa1','aaaa2','aaaa3','aaaa5','aaaa11'] listb=[('aaaa1',...
  • python tuple元素赋值

    2020-03-15 11:54:43
    不同于list,python tuple中元素本身允许被修改,直接赋值会报错,例如: some_tuple = (1,2,3) >>> some_tuple[0] = [2] Traceback (most recent call last): File "<stdin>", line 1, in &...
  • 本文的文字及图片来源于网络,仅供学习、交流使用,具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 本篇文章来自腾讯云 作者:行哥玩Python ( 想要学习Python?Python学习交流群:1039649593,...
  • 点击上方“IT共享之家”,进行关注回复“资料... tuple元组的定义Python的元组与列表类似,不同之处在于元组的元素不修改。元组使用小括号,列表使用方括号。元组创建很简单,只需要在括号添加元素,并使用逗号...
  • Python之元组tuple遍历元素

    万次阅读 2019-01-04 17:22:52
    Tuple的同样需要遍历嘛,只是一旦创建后,元素不可变,遍历同List一样 分开写的原因是,就像那位大牛说的,层级都不要太深,本来就low,一下子放在一起,知识不好巩固 0、直接上干货,第一种:for in girl_...
  • 我所理解的元素修改是: 能对已经赋值或者初始化的数据类型进行元素的修改,这里的修改不是指片面意思上的输错了数值,将光标移到对应位置,按下删除键,再进行数据的修改等操作,也不是指对对象的重新赋值。 重新...
  • Tuple可变 list。 一旦创建了一个 tuple能以任何方式改变它。 Tuple 与 list 的相同之处 定义 tuple 与定义 list 的方式相同, 除了整个元素集是用小括号包围的而不是方括号。 Tuple元素与 list 一样按...
  • tuple

    2018-04-15 21:59:14
    tuple和list非常类似,但是tuple一旦初始化就修改最后来看一个“可变的”tuple:&gt;&gt;&gt; t = ('a', 'b', ['A', 'B']) &gt;&gt;&gt; t[2][0] = 'X' &gt;&gt;&gt; t[2]...
  • Python修改元组的元素

    千次阅读 2020-03-17 21:53:59
    输入矩形块儿维度 dimensions = (200, 50) print(dimensions[0]) print(dimensions[1]) ...print(dimensions[0])####元组元素无法修改 打印结果 Traceback (most recent call last): File "D...
  • 可以使用 index 的方式对 tuple 进行访问,比如下面访问 tuple 的第二个元素。 thistuple = ("apple", "banana", "cherry") print(thistuple[1]) PS E:\dream\markdown\python> & "C:/Program Files ...
  • 1. 引入头文件 #include <tuple> 2. std::tuple初始化 std::tuple<int> t1(10...std::tuple<int> foo_tuple() { return {1, -1}; // Error until N4387 return std::tuple<int>{1, -1}; // Always works return
  • 在C++, tuple是一种将多个不同类型元素组合在一起成为一个数据列,然后进行提取使用的变量类型,类似于pair,又可以称为是pair的扩展。
  • Scala中Tuple(元组)的使用

    万次阅读 2016-11-30 22:17:32
    在我们使用某些编程语言开发时,...将返回值作为参数参入函数或者方法,然后修改实参,这样就相当于“返回值”。如: public void func1(String arg1,String arg2){ arg1 = "abc"; arg2 = "bcd"; }这种方式代码比较
  • Python中内置了list集合与tuple集合,在list集合中可以实现元素的添加、修改、插入、以及删除。tuple集合看似与list类似,但两者还是有很大的区别。 在tuple集合中,一旦元素被存储,以后就修改,删除了,这比...
  • 元组tuple和列表list的区别:元组能改变元组可变对象,列表可以 声明一个元组: a = (1,2,3) 声明一个只有一个元素的元组 a = (1,) #注意,必须要有‘,’,不然会被当做当个元素对应的类型 print...
  • 元组tuple

    2020-03-12 09:36:16
    属于可变类型,支持原位修改 通过下标索引访问元组元素 长度固定 任意嵌套 元组常用操作 #元组的声明用圆括号 (1,2) (1, 2) #元组的声明在某些情况下这个圆括号可以省略 1,2 (1, 2) #声明一个只包含一个...
  • python的list和tuple

    2017-09-25 12:59:46
    可以用索引来访问list的每一个位置的元素,记得索引是从0开始。 如果要取得最后一个元素,除了计算索引位置外,还可以用-1做索引,直接获得最后一个元素。 list是一个可变的有序表,所以,可以往list...
  • Python 的元组与列表类似,不同之处在于元组的元素不修改。 t=();#空元组猜 t=(12,3,3,'tom','OK',False); print(len(t)) print(t) 增、删、不可以 c=(2,3,3,'tom','OK',False) d=('张飞','刘备') c=c+d; ...
  • 如何使用 C# Tuple

    2021-01-21 23:49:22
    开局一张图,首先声明的是 ...值得注意的是,Tuple 元素是 只读的,而且其元素的顺序也是在 Tuple 创建的时候指定好的,能对其中的元素进行后续修改修改 Tuple 的大小。 为什么要使用 Tuple 下面罗列.
  • 学习参考:...如果元组只有一个元素,要在元素后加一个逗号 (5,) 如果加逗号,解释器不会将小括号当成元组。 info_tuple = ("zhangsan", 18, 1.75, "zhangsan") # 1. 取值 pr...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 56,073
精华内容 22,429
关键字:

tuple中的元素不可以修改