Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。自从20世纪90年代初Python语言诞生至今,它逐渐被广泛应用于处理系统管理任务和Web编程。Python已经成为最受欢迎的程序设计语言之一。2011年1月,它被TIOBE编程语言排行榜评为2010年度语言。自从2004年以后,python的使用率是呈线性增长。
Python在设计上坚持了清晰划一的风格,这使得Python成为一门易读、易维护,并且被大量用户所欢迎的、用途广泛的语言。
鉴于以上各种优点,忍不住对Python进行了一番学习,略有收获,分享给大家。
最近对Python 的对象引用机制稍微研究了一下,留下笔记,以供查阅。
首先有一点是明确的:「Python 中一切皆对象」。
那么,这到底意味着什么呢?
如下代码:
#!/usr/bin/env python
a = [0, 1, 2] # 来个简单的list
# 最初,list 和其中各个元素的id 是这样的。
print 'origin'
print id(a),a
for x in a:
print id(x), x
print '----------------------'
# 我们把第一个元素改改
print 'after change a[0]'
a[0] = 4
print id(a),a
for x in a:
print id(x), x
print '----------------------'
# 我们再把第二个元素改改
print 'after change a[1]'
a[1] = 5
print id(a),a
for x in a:
print id(x), x
print '----------------------'
# 回头看看直接写个0 ,id是多少
print 'how about const 0?'
print id(0), 0
运行结果如下:
PastgiftMacbookPro:python pastgift$ ./refTest.py
Origin
[0, 1, 2]
0
1
2
----------------------
after change a[0]
[4, 1, 2]
4
1
2
----------------------
after change a[1]
[4, 5, 2]
4
5
2
----------------------
how about const 0?
0
从「Origin」部分来看,list 中各个元素的地址之间都正好相差24,依次指向各自的数据——这让我想到了数组。
当修改a[0] 的值之后,发现,a[0] 的地址发生了变化。也就是说,赋值语句实际上只是让a[0] 重新指向另一个对象而已。此外,还注意到,a[0] 的地址和a[2]的地址相差48(2个24)。
当再次修改a[1] 之后,同样地,a[1] 的地址也发生变化,有趣的是,这次a[1] 的地址和a[0] 的地址又相差24,和原先的a[2] 相差72(3个24)。
最后,当直接把数字0的地址打印出来后,发现它的地址和最开始的a[0] 的地址完全一样。
至此,基本可以说明,就算是list 中的元素,其实也是引用。修改list 中的元素,实际上还是在修改引用而已。
对于Python 中类属性,有人提到过「类属性在同一类及其子类之间共享,修改类属性会影响到同一类及其子类的所有对象」。
听着挺吓人,但仔细研究之后,其实倒也不是什么大不了的事情。
如下代码:
#!/usr/bin/env python
class Bird(object):
name = 'bird'
talent = ['fly']
class Chicken(Bird):
pass
bird = Bird();
bird2 = Bird(); # 同类实例
chicken = Chicken(); # 子类实例
# 最开始是这样的
print 'Original attr'
print id(bird.name), bird.name
print id(bird.talent), bird.talent
print id(bird2.name), bird2.name
print id(bird2.talent), bird2.talent
print id(chicken.name), chicken.name
print id(chicken.talent), chicken.talent
print '----------------------------'
# 换个名字看看
bird.name = 'bird name changed!'
print 'after changing name'
print id(bird.name), bird.name
print id(bird.talent), bird.talent
print id(bird2.name), bird2.name
print id(bird2.talent), bird2.talent
print id(chicken.name), chicken.name
print id(chicken.talent), chicken.talent
print '----------------------------'
# 洗个天赋试试(修改类属性中的元素)
bird.talent[0] = 'walk'
print 'タレント変更後(リスト)'
print id(bird.name),bird.name
print id(bird.talent),bird.talent
print id(bird2.name )、bird2.name
print id(bird2.talent)、bird2.talent
print id(chicken.name)、chicken.name
print id(chicken.talent)、chicken.talent
印刷 '-------------------------------------'
# 新しいタレント ツリーに変更します (クラス属性全体を置き換えます)
bird.talent = ['swim']
print 'タレントの再割り当て後'
print id(bird.name)、bird.name
print id(bird.talent)、bird.talent
print id(bird2.name)、bird2。 name
print id(bird2.talent)、bird2.talent
print id(chicken.name)、chicken.name
print id(chicken.talent)、chicken.talent
print '-- ------------------------
# 新しいタレント ツリーをウォッシュアウトします (新しいクラス属性の要素を変更します)
bird.talent[0] = 'dance'
print 'タレントの再割り当て後の変更要素'
print id(bird.name),bird.name
print id(bird.talent),bird.talent
print id(bird2.name), bird2.name
print id(bird2.talent)、bird2.talent
print id(chicken.name)、chicken.name
print id(chicken.talent)、chicken.talent
print ' ----------------------------'
実行結果:
PastgiftMacbookPro:python pastgift$ ./changeAttributeTest.py
元の属性
鳥
['fly']
鳥
['fly']
鳥
['fly']
---------- --- ----------------
名前変更後
鳥の名前が変わりました!
['fly']
bird
['fly ']
鳥
['fly']
----------------------------
変更後タレント(リスト)
鳥の名前が変更されました!
['walk']
bird
['walk']
bird
['walk']
--- ----- -------------------
タレントの再割り当て後
birdの名前が変更されました!
['swim']
bird
['散歩']
鳥
['散歩']
---------------------- -
タレントの再割り当て後の要素の変更
鳥の名前が変更されました!
['dance']
bird
['walk']
bird
['walk']
---- ------------------------
「Origin」では、同じ型のオブジェクトやサブクラスオブジェクトの同じクラス属性のアドレスが同じ、いわゆる「共有」です。
名前を変更すると、変更されたオブジェクトの name 属性のみが変更されます。これは、name への代入操作が実際には文字列を変更し、それを再引用しているためです。文字列自体は変更されていません。したがって、同じクラスとサブクラスの間には相互影響はありません。
次に、タレントの要素を変更します。この時点で状況が変わりました。同じクラスとそのサブクラスのタレント属性がすべて一緒に変更されました。これらはすべて同じメモリ アドレスと同じオブジェクトを参照しているため、これは理解しやすいです。
次に、タレントを再割り当てします。つまり、別のオブジェクトを参照するように変更します。その結果、このインスタンスのタレント属性のみが変更されます。メモリ アドレスから、このインスタンスと他のインスタンスのタレント属性が同じオブジェクトを指していないことがわかります。つまり、「この時点で、この例はすでに部外者である」ということです。
その後、最終的にタレントの要素を再度変更すると、他のインスタンスには影響がないことが簡単に理解できます。もう「部外者」だから、いくらいじっても、すべて自分のことだ。
したがって、「同じクラスとそのサブクラス間でクラス属性が相互に影響を与える」には前提条件が必要です。インスタンスの作成後、そのクラス属性は一度も再割り当てされていない、つまり、クラス属性は依然としてメモリアドレスを指しているということです。元々は を指していました。
最後に、オブジェクトのプロパティについて触れてみましょう
次のコード:
#!/usr/bin/env python
class Bird(object):
def __init__(self):
self.talent = ['fly']
bird = Bird()
bird2 = Bird()
# 初期状況
print 'Origin'
print id(bird.talent),bird.talent
print id(bird2.talent),bird2.talent
print '-- - -----------------'
# いずれかのオブジェクトのプロパティを変更します
bird.talent[0] = 'walk'
print '属性変更後'
print id(bird.talent),bird.talent
print id(bird2.talent),bird2.talent
print '-------- ------------「
# Seek death: 2 つのオブジェクトの属性は同じメモリ アドレスを指し、
bird.talent =bird2.talent
bird.talent[0] = 'swim'
print '別の属性に割り当てて変更します'
print id(bird.talent),bird.talent
print id(bird2.talent),bird2.talent
print '---- ----------------'
実行結果:
PastgiftMacbookPro:python pastgift$ ./changeAttributeTest2.py
Origin
['fly']
['fly']
---------- - --------
属性変更後
['walk']
['fly']
----- ----
別の属性に割り当てて変更します
['swim']
['swim']
------ ---
オブジェクトの属性の内容が全く同じ(初期化直後の属性の内容は一般に同じ)であっても、全く異なるメモリアドレスに割り当てられるためです。したがって、「類似したオブジェクト間の影響」はありません。
しかし、あるオブジェクトの属性と別のオブジェクトの属性が同じアドレスを指している場合、その 2 つは (ただし 2 つの間でのみ) 相互に関係します。

Pythonは、データサイエンス、Web開発、自動化タスクに適していますが、Cはシステムプログラミング、ゲーム開発、組み込みシステムに適しています。 Pythonは、そのシンプルさと強力なエコシステムで知られていますが、Cは高性能および基礎となる制御機能で知られています。

2時間以内にPythonの基本的なプログラミングの概念とスキルを学ぶことができます。 1.変数とデータ型、2。マスターコントロールフロー(条件付きステートメントとループ)、3。機能の定義と使用を理解する4。

Pythonは、Web開発、データサイエンス、機械学習、自動化、スクリプトの分野で広く使用されています。 1)Web開発では、DjangoおよびFlask Frameworksが開発プロセスを簡素化します。 2)データサイエンスと機械学習の分野では、Numpy、Pandas、Scikit-Learn、Tensorflowライブラリが強力なサポートを提供します。 3)自動化とスクリプトの観点から、Pythonは自動テストやシステム管理などのタスクに適しています。

2時間以内にPythonの基本を学ぶことができます。 1。変数とデータ型を学習します。2。ステートメントやループの場合などのマスター制御構造、3。関数の定義と使用を理解します。これらは、簡単なPythonプログラムの作成を開始するのに役立ちます。

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

Python 3.6のピクルスファイルのロードレポートエラー:modulenotFounderror:nomodulenamed ...

風光明媚なスポットコメント分析におけるJieba Wordセグメンテーションの問題を解決する方法は?風光明媚なスポットコメントと分析を行っているとき、私たちはしばしばJieba Wordセグメンテーションツールを使用してテキストを処理します...


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

WebStorm Mac版
便利なJavaScript開発ツール

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

メモ帳++7.3.1
使いやすく無料のコードエディター
