使用引用复制如何更改元组的对象值?

时间:2018-10-02 15:21:46

标签: python

我正在学习Python数据结构。如果元组被认为是不可变的,谁能解释我如何通过引用复制来更改元组的对象值?

>>> tuple1=[20,30,40]
>>> tuple2=tuple1
>>> print(tuple2)
[20, 30, 40]
>>> tuple2[1]=10
>>> print(tuple2)
[20, 10, 40]
>>> print(tuple1)
[20, 10, 40]

3 个答案:

答案 0 :(得分:2)

您有列表,没有元组。如果您真的在元组上尝试过

x = (1, 2, 3) # or x = tuple([1, 2, 3])
x[1] = 5

你得到

TypeError: 'tuple' object does not support item assignment

证明了它们的不变性。

更重要的是,可变/不可变和按值/按引用是两个不同的事物。 x变量是对内存中实际对象的实际引用(不是其值的副本),但是仍然不能更改实际对象。值/引用将对可变对象有所不同,因为更改对象时,您需要知道是要更改副本还是原始对象。

答案 1 :(得分:0)

在无法更改所包含的对象的意义上,字符串是不可变的(即,元组本身保持不变)。例如

app.on('ready', function() {
  //call python?
  var subpy = require('child_process').spawn('python', ['./hello.py']);

  var rq = require('request-promise');
  var mainAddr = 'http://localhost:5000';

  var openWindow = function(){
    // Create the browser window.
    mainWindow = new BrowserWindow({width: 800, height: 600});
    // and load the index.html of the app.
    // mainWindow.loadURL('file://' + __dirname + '/index.html');
    mainWindow.loadURL('http://localhost:5000');
    // Open the devtools.
    mainWindow.webContents.openDevTools();
    // Emitted when the window is closed.
    mainWindow.on('closed', function() {
      // Dereference the window object, usually you would store windows
      // in an array if your app supports multi windows, this is the time
      // when you should delete the corresponding element.
      mainWindow = null;
      // kill python
      subpy.kill('SIGINT');
    });
  };

是不可能的。但是,您可以做的是元组引用的 modify 对象。例如:

>>> t = (1, 2)
>>> t[0] = 3

输出

t = (1, [2])
print(t)
t[1][0] = 3
print(t)

元组(1, [2]) (1, [3]) 仍包含与以前相同的对象,但是其中一个对象(t)已更改(使元组保持不变)。

答案 2 :(得分:0)

您可以通过将 tuple 转换为 list ,修改 list ,然后再转换回元组,如果您的最终输出是 list ,则该路线仅适用于 tuple list 版本>

tup = (20,30,40)
tup = [*tup]
tup[0] = 10
tup = tuple(tup)
(20, 30, 40)
[20, 30, 40]
[10, 30, 40]
(10, 30, 40)