Python3中的指针你了解吗

 更新时间:2024年02月28日 08:54:59   作者:DECHIN  
Python这个编程语言虽然没有指针类型,但是Python中的可变参量也可以像指针一样,改变一个数值之后,所有指向该数值的可变参量都会随之而改变,这篇文章主要介绍了Python3中的“指针”,需要的朋友可以参考下

技术背景

在python中定义一个列表时,我们一定要注意其中的可变对象的原理。虽然python的语法中没有指针,但是实际上定义一个列表变量时,是把变量名指到了一个可变对象上。如果此时我们定义另外一个变量也指到同一个可变对象的话,就会造成一个“联动”的现象。也就是改变其中的一个值时,另一个值也会随之而改变。本文使用的Python版本为Python 3.7.13

测试案例

这里我们先定义一个列表a,然后把这个空的列表a直接赋值给变量b,此时a和b都是一个空的列表:

In [1]: a = []
In [2]: b = a
In [3]: print (a,b)
[] []

那么如果此时我们修改a的值,那么此前被a赋值的变量b是否也会随之改变呢?

In [4]: a.append(1)
In [5]: print (a,b)
[1] [1]
In [6]: a.append(2)
In [7]: print (a,b)
[1, 2] [1, 2]
In [8]: a = [3]
In [9]: print (a,b)
[3] [1, 2]
In [10]: a.append(4)
In [11]: print (a,b)
[3, 4] [1, 2]
 

从运行结果来看,我们可以发现,当对a先后扩展一个元素1和2时,变量b的值也随之改变,跟a是同步变化的。但是如果把a这个变量名指向一个新的列表上,此时b的值不会发生变化。这就相当于,给变量a赋新的值的时候,变量b指向了a原来的值,而a这个变量名指向了新的数值,此后两者之间的关联就消失了。之所以没有指针定义的python编程语言,会出现这样的情况,就是因为列表类型属于可变参量,所以如果把两个变量指向同一个列表,两个变量的值是会同步的,即使初始的列表不是一个空的列表,结果也是一样的:

In [23]: a = [1]
In [24]: b = a
In [25]: a += [2]
In [26]: print (a,b)
[1, 2] [1, 2]

而且这个同步还是双向的,也就是说,修改a会同步到b,修改b也会同步到a:

In [11]: a = []
In [12]: b = a
In [13]: b.append(5)
In [14]: print (a,b)
[5] [5]

那么除了列表这个数据结构之外,其他类型的数据结构是否存在类似的现象呢?首先用字典类型来测试一下:

In [10]: a = {}
In [11]: b = a
In [12]: print (a,b)
{} {}
In [13]: a[1]=1
In [14]: print (a,b)
{1: 1} {1: 1}

经过测试我们发现,字典也是属于可变参量的类型。除了列表和字典外,其他的就是普通的数值类型和元组Tuple类型,还有一些第三方定义的数据类型,也可以分别测试一下:

In [15]: a = 1
In [16]: b = a
In [17]: a += 1
In [18]: print (a,b)
2 1
In [19]: a = (1,)
In [20]: b = a
In [21]: a += (2,)
In [22]: print (a,b)
(1, 2) (1,)
In [23]: a = '1'
In [24]: b = a
In [25]: a += '2'
In [26]: print (a,b)
12 1
 

测试结果表明,数值类型和元组类型在“链式”赋值之后,是直接把值给了其他变量的,而不是传递一个指针。但是另一个需要引起重视的是,第三方numpy所定义的array,也是一个可变参量:

In [15]: a = 1
In [16]: b = a
In [17]: a += 1
In [18]: print (a,b)
2 1
In [19]: a = (1,)
In [20]: b = a
In [21]: a += (2,)
In [22]: print (a,b)
(1, 2) (1,)
In [23]: a = '1'
In [24]: b = a
In [25]: a += '2'
In [26]: print (a,b)
12 1
 

可以发现,a和b两者的结果也是同步变化的。因为没研究过Python的底层实现,也许区分可变参量和非可变参量的方法,就是看其能不能被哈希

In [15]: hash(1)
Out[15]: 1
In [16]: hash([1])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-16-0579e98ca3ee> in <module>
----> 1 hash([1])
TypeError: unhashable type: 'list'
In [17]: hash({'1':1})
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-17-b18acecf6a20> in <module>
----> 1 hash({'1':1})
TypeError: unhashable type: 'dict'
In [18]: hash((1,))
Out[18]: 3430019387558
In [29]: hash(np.array([1.]))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-29-b9e8d96de6be> in <module>
----> 1 hash(np.array([1.]))
TypeError: unhashable type: 'numpy.ndarray'
In [30]: hash(np.array([1.]).tobytes())
Out[30]: 1211024724661850177

从结果中我们发现,那些可以被哈希的类型都是非可变参量,也就是在“链式赋值”的过程中不会发生“联动”的类型。

总结概要

假如你在Python中初始化了一个变量a的值,然后用a来初始化另一个变量b,此时你希望得到的b的数值是跟a同步变化的,还是独立变化的呢?Python这个编程语言虽然没有指针类型,但是Python中的可变参量也可以像指针一样,改变一个数值之后,所有指向该数值的可变参量都会随之而改变。就比如说改变a的值,会同步的去改变b的值。那么我们应该对这种类型的赋值有所了解,才能够避免在实际的编程中犯错。

到此这篇关于Python3中的指针你了解吗的文章就介绍到这了,更多相关Python3 指针内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python 类与元类的深度挖掘 I【经验】

    Python 类与元类的深度挖掘 I【经验】

    super() 方法解决了类->实例实践过程中关于命名空间的一些问题,而关于生成对象的流程,我们知道初始化实例是通过类的 __init__() 方法完成的,在此之前可能涉及到一些其它的准备工作,包括接下来提到的 mro() 方法以及关键的元类->类的过程
    2016-05-05
  • python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算

    python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算

    这篇文章主要介绍了python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • 1秒钟使用python建立文件服务器的方法步骤

    1秒钟使用python建立文件服务器的方法步骤

    本文主要介绍了1秒钟使用python建立文件服务器的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • Python 十大特性

    Python 十大特性

    这篇文章主要给大家分享的是Python十大特性,Python 编程语言是世界上发展最快的编程语言。这一高级通用编程语言提供了广泛的实际应用,并且是一种非常流行的认证,下面我们就来看看它都有哪些特性吧
    2022-01-01
  • python实现简单爬虫功能的示例

    python实现简单爬虫功能的示例

    本文主要是介绍python实现简单爬虫功能的示例,主要实现了把我们想要的图片爬虫到本地的一个示例,有需要的朋友可以了解一下。
    2016-10-10
  • tensorflow实现逻辑回归模型

    tensorflow实现逻辑回归模型

    这篇文章主要为大家详细介绍了tensorflow实现逻辑回归模型的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • Python KMeans聚类问题分析

    Python KMeans聚类问题分析

    这篇文章主要为大家详细介绍了Python KMeans聚类问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 解决python

    解决python "No module named pip"的问题

    今天小编就为大家分享一篇解决python "No module named pip"的问题。具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • Python计算当前日期是一年中的第几天的方法详解

    Python计算当前日期是一年中的第几天的方法详解

    在Python中,计算当前日期是一年中的第几天可以通过内置的datetime模块来实现,本文将详细介绍如何使用Python编写代码来完成这个任务,需要的可以参考下
    2023-12-12
  • python调用xlsxwriter创建xlsx的方法

    python调用xlsxwriter创建xlsx的方法

    今天小编就为大家分享一篇python调用xlsxwriter创建xlsx的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05

最新评论