当前位置: 首页 > 科技观察

python中一切皆变量这句话怎么理解?

时间:2023-03-20 12:31:43 科技观察

Python的一个好处是与其他语法繁重的语言相比,它相对易于使用。但是,随着学习的深入,你会发现Python有很多隐藏的特性贯穿其中,所以了解它背后的内容对我们是有好处的。这就引出了一个话题:Python中的一切都是对象。那么今天就让我们一探究竟吧。Python中具有挑战性的概念之一是如何创建和分配变量。在编程中,有时会用到盒子的类比。每个框都是一个变量,该框的内容就是它的值。这不是一个很好的类比,正如我稍后将展示的那样,它可能会产生很大的问题,尤其是在考虑Python时。相反,最好将变量名视为标签。它们可以放在盒子上,但不包含任何东西。盒子(一个对象)保存值。贴纸只是一个标签。此外,可以在任何盒子上放置多个贴纸。简而言之,我们更改的是Python中的对象,而不是它们的名称。两个有用的函数:id()和type()在下面的示例中,我将探讨Python如何与各种可变和不可变对象交互。为了全面检查其行为,我将广泛使用id()和type()函数。首先,让我们看一下这两个函数,以便了解它们的输出。id()将一个对象作为参数并返回它的id(一个数字)。在幕后,这实际上是C存储对象的内存地址(在CPython实现中)。我们可以比较不同名称的ID,看看它们是否指向同一个对象,因为每个对象都有一个唯一的ID。我们稍后会讨论这个,但现在,一个使用id()的简单示例:>>>a=5>>>id(a)10105216>>>b=10>>>id(b)10105376现在,让我们看看类型()。与id()一样,type()将对象作为参数,但返回对象的类类型而不是其ID。当我们开始挑选不同类型的对象及其可变性/不变性时,这将派上用场。同样,让我们??看一个简单的例子:>>>msg='hello'>>>type(msg)>>age=10>>>type(msg)现在我们对type()和id()有了基本的了解,让我们使用它们开始探索Python中的可变和不可变对象。可变对象可变对象是可以在Python中更改的对象。它们的数量远少于不可变对象,包括:列表、集合和字典。他们有一些有趣的行为,乍一看似乎令人困惑。让我们看看我的意思的一些例子:>>>list1=[1,2,3]>>>list2=list1>>>id(list1)140336099032264>>>id(list2)140336099032264>>>list2.append(4)>>>list1[1,2,3,4]在这里,我们创建了一个名为list1的列表,然后为该列表分配了另一个名称(list2)。两个名称都指向同一个对象,如它们的共享ID所示。我们通过调用名称list2附加列表,然后使用list1打印列表。它打印出我们的新列表。为什么?创建list2时,我们没有创建另一个对象,我们只是创建了另一个指向与list1相同的对象的名称。方法不作用于名称,它们作用于对象。所以当我们键入:“list2.append(4)”时,我们的意思是:“将4追加到list2指向的列表对象”。如果我们想更改list2而不是list1怎么办?好吧,我们必须先复制列表。>>>list1=[1,2,3]>>>list3=list1[:]>>>id(list1)140336099032264>>>id(list3)140336098233352>>>list3。append(4)>>>list1[1,2,3]我们复制list1指向的对象,然后从该副本创建一个新对象。现在,当我们更改list3中的某些内容时,更改不会反映在list1中,因为我们没有更改同一个对象。通过创建两个包含相同元素的列表可以证明同一件事。>>>list1=[1,2,3]>>>list2=[1,2,3]>>>id(list1)140397858622984>>>id(list2)140397851306184每个元素(在本例中为整数)是不可变的,但列表本身是可变的。我们可以随意添加、弹出和修改它们,而不会对其他列表进行任何更改。对于不可变对象,情况并非如此。不可变对象不可变对象构成了我们将在Python中与之交互的大部分对象。它们包括字符串、整数、浮点数和元组之类的东西。让我们看看最后一个例子,但这次我们将使用两个字符串而不是两个列表:>>>string1="hello">>>string2="hello">>>id(string1)140336098225712>>>id(string2)140336098225712看,string1和string2的ID是一样的,也就是说它们其实是同一个对象。这怎么可能?好吧,原因是因为字符串是不可变的。其他不可变对象也是如此:>>>a=5>>>b=5>>>id(b)10105216>>>id(a)10105216现在,如果我们改变a的值,它的id应该改变>>>a=4>>>id(a)10105184我们要做的是将我们的名字a放在一个新的int对象上。当我们重新分配一个指向不可变对象的名称时,这正是我们所做的。函数中的可变对象和不可变对象可变对象和不可变对象的属性使它们的功能不同。虽然对可变对象的更改超出了函数的范围,但对不可变对象的更改却不是。让我们看几个例子:>>>defstrFunc(oldString)...oldString="goodbye"...>>>oldString="hello">>>strFunc(oldString)>>>print(oldString)hello我们更新了函数内的字符串被删除,但它的旧值在退出时保留。请注意,没有返回语句。如果我们一直返回字符串并打印值,情况就会不同。现在,让我们尝试对可变对象做同样的事情:>>>deflistFunc(oldList)...oldList[0]='goodbye'...>>>oldList=['hello']>>>listFunc(oldList)>>>print(ListFunc[0])goodbye在这种情况下,我们将可变对象发送到函数中。然后我们更新了列表的成员,它们现在位于函数的范围之外。为什么理解这一点很重要?了解您使用的是可变对象还是不可变对象会对您的代码产生重要的实际影响。Python以不同的方式对待可变对象和不可变对象,这是有影响的。了解您正在使用的对象类型对于避免错误和调试代码非常方便。