【问题标题】:Why does pop() function alters a list value of dictionary but capitalize() can't change case of a string value? [duplicate]为什么 pop() 函数会更改字典的列表值,但 capitalize() 不能更改字符串值的大小写? [复制]
【发布时间】:2019-12-22 06:33:46
【问题描述】:

我正在尝试更改值而不重新分配字典中的任何值。但似乎它适用于 pop 函数,而不适用于字符串函数。

我尝试了其他列表函数,效果和 pop 一样。看起来列表和字符串在用作值时的工作方式不同。

my_dict={"Rank":[1,2,3],"Name":"John"}
my_dict.get("Rank").pop()
print(my_dict)
my_dict.get("Name").capitalize()
print(my_dict)

【问题讨论】:

  • list 对象是可变的。列表上的一些方法是 mutator 方法,也就是说,它们“就地”工作。 .pop 就是这样一种方法。 str 对象是不可变的。这仅仅意味着他们缺少修改器方法,所以你知道他们的方法都不会“就地”工作。所以.capitalize() 只是返回一个新字符串,它会立即被丢弃(因为你没有将它分配给任何东西)

标签: python python-3.x


【解决方案1】:

因为:

  • list.pop - 对列表本身进行(就地)操作(删除(最后一个)元素)并因此对其进行修改
  • [Python 3.Docs]: Built-in Types - str.capitalize() - 不对字符串进行操作,而是返回(修改后的)副本,保持原始副本不变

要纠正您的问题,请使用:

my_dict["Name"] = my_dict["Name"].capitalize()

【讨论】:

    【解决方案2】:

    caplitalize() 返回一个 str 对象。如果要更新值,则需要将其推回字典。

    my_dict["Name"] = my_dict.get("Name").capitalize()
    

    【讨论】:

      【解决方案3】:

      my_dict.get("Rank") 是一个可变列表,您只是在使用对它的引用。您对其所做的任何更改,包括pop(),都会在各处反映出来。

      my_dict.get("Name") 是一个不可变的字符串。您无法更改它,因此capitalize() 将返回一个新字符串,而不是修改现有字符串。

      【讨论】:

      • 但是 Python 中的字典是可变的。 my_dict.get("Name") 值不是单独存储,而是存储在字典对象本身中。
      • @PrashantKumarGupta 是的,但您从未在任何地方修改过字典。你确实改变list对象,你改变str对象,因为str对象是不可变的。
      • 为什么这也不起作用my_dict={"Rank":[1,2,3],"Name":"John","Salary":100.0} my_dict.get("Rank")[1].__add__(1) print(my_dict)
      • @PrashantKumarGupta 出于同样的原因:int 对象是不可变的。他们的方法都没有就地工作。顺便说一句,您几乎不应该像这样直接使用双下划线方法
      猜你喜欢
      • 2022-06-13
      • 2011-01-07
      • 2019-12-24
      • 1970-01-01
      • 2015-07-15
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 2021-01-05
      相关资源
      最近更新 更多