当前位置: 首页 > 面试题库 >

对象和基本类型的分配

甄志
2023-03-14
问题内容

有以下代码:

# assignment behaviour for integer
a = b = 0
print a, b # prints 0 0
a = 4
print a, b # prints 4 0 - different!

# assignment behaviour for class object
class Klasa:
    def __init__(self, num):
        self.num = num

a = Klasa(2)
b = a
print a.num, b.num # prints 2 2
a.num = 3
print a.num, b.num # prints 3 3 - the same!

问题:

  1. 为什么赋值运算符对基本类型和类对象的工作方式不同(对于按值复制的基本类型,对于按引用复制的类对象)?
  2. 如何仅按值复制类对象?
  3. 如何对C ++ int&b = a 这样的基本类型进行引用?

问题答案:

这是许多Python用户的绊脚石。对象引用的语义与C程序员习惯的语义不同。

让我们来考虑第一种情况。当您说时a = b = 0,将int创建一个具有值的新对象,并创建了对其的0两个引用(一个是a,另一个是b)。这两个变量指向同一个对象(我们创建的整数)。现在,我们运行a = 4。将创建一个新int的价值对象,4a指向该对象。这意味着,对的引用数4为1,并且对的引用数0减少了1。

将此与a = 4a“指向”的内存区域写入的C中进行比较。a = b = 4用C表示4写到两块存储器-一个用于a另一个用于b

现在,第二种情况a = Klass(2)创建一个类型为object的对象Klass,将其引用计数加1并a指向该对象。b = a只需将a指向的对象b指向同一事物,并将该事物的引用计数加一。这与您这样做会发生的情况相同a = b = Klass(2)。由于您要取消引用相同的对象并打印属性值a.numb.num因此尝试进行打印并保持相同。您可以使用id内置函数来查看该对象是相同的(id(a)并且id(b)将返回相同的标识符)。现在,通过为对象的属性之一分配值来更改对象。由于ab指向同一对象,您希望当通过a或访问该对象时,值的变化是可见的b。事实就是如此。

现在,为您的问题的答案。

  1. 这两个的赋值运算符没有什么不同。它所做的只是html" target="_blank">添加对RValue的引用,并使LValue指向它。它 始终是 “通过引用”(尽管该术语在参数传递的上下文中比简单的赋值更有意义)。
  2. 如果要 复制 对象,请使用复制模块。
  3. 就像我在第1点中所说的那样,当您进行分配时,您总是会移动引用。除非您要求复制,否则永远不会完成。


 类似资料:
  • 本文向大家介绍js对象类型,基本对象类型以及引用对象类型的区别?相关面试题,主要包含被问及js对象类型,基本对象类型以及引用对象类型的区别?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 分为基本对象类型和引用对象类型 基本数据类型:按值访问,可操作保存在变量中的实际的值。基本类型值指的是简单的数据段。基本数据类型有这六种:undefined、null、string、number、bool

  • 本文向大家介绍javascript中基本类型和引用类型的区别分析,包括了javascript中基本类型和引用类型的区别分析的使用技巧和注意事项,需要的朋友参考一下 基本类型和引用类型 ECMAScript包含两个不同类型的值:基本类型值和引用类型值。基本类型值指的是简单的数据段;引用类型值指由多个值构成的对象。当我们把变量赋值给一个变量时,解析器首先要做的就是确认这个值是基本类型值还是引用类型值。

  • 所以我有这个代码: 它应该打开一个文本为"true"的消息对话框。问题是它会给出一个编译器错误,说我不能调用基元类型int的方法。为什么会发生这种情况? 铸造按预期工作。我只是不明白为什么对象会变成一个基本类型。

  • ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值。基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。 在将一个值赋给变量时,解析器必须确定这个值是基本类型值还是引用类型值。第3 章讨论了5 种基本数据类型:Undefined、Null、Boolean、Number 和String。这5 种基本数据类型是按值访问的,因为可以操作保存在变量中的实际的

  • 我在Spring应用程序中有不同的用户类型。我实现了某种继承。所有users类型都从User类扩展而来。我想这里两张桌子应该够了: 表“users”-包含所有共享实体属性的列 表“users_corporate”-包含CorporateCustomer类attriburtes:companyName和VatNumber的列 “用户”将具有:id、用户名、密码、第一名、最后名、电子邮件、手机、城市、

  • 面向对象简介 对象的作用是:封装信息。比如Student类里可以封装学生的姓名、年龄、成绩等。 对象具有特征(属性)和行为(方法)。 面向对象:可以创建自定义的类型,很好的支持继承和多态。 面向对象的特征:封装、继承、多态。 对象简介 基本数据类型和引用数据类型的对比 基本数据类型(值类型):String 字符串、Number 数值、Boolean 布尔值、Null 空值、Undefined 未定