ホームページ バックエンド開発 Python チュートリアル Pythonのfrom module import *の落とし穴

Pythonのfrom module import *の落とし穴

Jun 16, 2016 am 08:43 AM
import python

しかし、別の問題があります。あなたは、特定の変数を変更したと思っていますが、実際には、from モジュール import * の後の変数は更新されていません。これは、プログラムがまだ正常に実行される可能性があるため、非常に危険ですが、結果は次のようになります。はい、本番まで発見されなかったら大惨事になります。

例:

基本モジュールでいくつかの変数を定義しました:

1

2

3

4

5

6

7

8

# reference data type

class Demo:

 def __init__(self, name):

  self.name = name

demo = Demo('Demo')

 

# primitive type

foo = 1

ログイン後にコピー

次に、from module import を使用してモジュールで読み取ります。

1

2

3

4

5

6

7

from base import *

def read():

    print 'reference data id: ' + str(id(demo))

    print 'reference data value : ' + demo.name

 

    print 'primitive data id: ' + str(id(foo))

    print 'primitive data value: ' + str(foo)

ログイン後にコピー

別のモジュールに書きます:

1

2

3

4

5

6

7

8

9

10

import base

 

def write():

 print "\nOriginal:"

 print "Original reference data id: " + str(id(base.demo))

 base.demo.name = "Updated Demo" # this will reflect that change

 #base.demo = base.Demo("Updated Demo") # this won't relfect the change

 print "Original data id: " + str(id(base.foo))

 base.foo = 1000

 print "Original data id after assignment: " + str(id(base.foo))

ログイン後にコピー

次に、最初に書き込み、次に読み取りを行って、書き込まれた内容が有効かどうかを確認します。

1

2

3

4

5

6

7

8

9

10

import read

import write

 

print "before write"

read.read()

 

write.write()

 

print "\nafter write"

read.read()

ログイン後にコピー

結論はノーです、理由は次のとおりです:

from module import を使用する場合、実際にはメモリを指す参照またはポインタをコピーし、var と module.var の両方が同じメモリを指します
module.var を変更すると、実際には別のメモリを指すようになります。このとき、var と module.var は異なるメモリを指します
。 したがって、module.var の値は変更されましたが、var は依然として元のメモリと元の値
を指します。 これはオブジェクトの場合は理解しやすいですが、オブジェクト内の値を直接変更することはできますが、別のオブジェクトを指す場合は無効です。 プリミティブ型の場合、既存のメモリをインプレース変更するのではなく、各割り当てが異なるメモリ アドレスを指すため、これは実際には同じです。これは簡単に検証できます:

1

2

3

4

5

6

7

8

9

In [1]: a = 10

 

In [2]: id(a)

Out[2]: 20429204

 

In [3]: a = 100

 

In [4]: id(a)

Out[4]: 20430108

ログイン後にコピー

したがって、手早く汚いスクリプトでない限り、from module import * を使用しないことをお勧めします。

例: https://github.com/baiyanhuang/blog/tree/master/arena/python/from_module_import

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ランプアーキテクチャの下でnode.jsまたはPythonサービスを効率的に統合する方法は? ランプアーキテクチャの下でnode.jsまたはPythonサービスを効率的に統合する方法は? Apr 01, 2025 pm 02:48 PM

多くのウェブサイト開発者は、ランプアーキテクチャの下でnode.jsまたはPythonサービスを統合する問題に直面しています:既存のランプ(Linux Apache MySQL PHP)アーキテクチャWebサイトのニーズ...

LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? Apr 01, 2025 pm 05:09 PM

LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

Scapy Crawlerを使用するときにパイプラインの永続的なストレージファイルを書き込めない理由は何ですか? Scapy Crawlerを使用するときにパイプラインの永続的なストレージファイルを書き込めない理由は何ですか? Apr 01, 2025 pm 04:03 PM

Scapy Crawlerを使用する場合、パイプラインの永続的なストレージファイルを書くことができない理由は?ディスカッションデータクローラーにScapy Crawlerを使用することを学ぶとき、あなたはしばしば...

Python hourglassグラフ図面:可変未定義エラーを避ける方法は? Python hourglassグラフ図面:可変未定義エラーを避ける方法は? Apr 01, 2025 pm 06:27 PM

Python:Hourglassグラフィック図面と入力検証この記事では、Python NoviceがHourglass Graphic Drawingプログラムで遭遇する可変定義の問題を解決します。コード...

PythonプロセスプールがTCPリクエストを同時に処理し、クライアントが立ち往生する理由は何ですか? PythonプロセスプールがTCPリクエストを同時に処理し、クライアントが立ち往生する理由は何ですか? Apr 01, 2025 pm 04:09 PM

Python Process Poolは、クライアントが立ち往生する原因となる同時TCP要求を処理します。ネットワークプログラミングにPythonを使用する場合、同時のTCP要求を効率的に処理することが重要です。 ...

Python functools.partialオブジェクトによって内部的にカプセル化された元の関数を表示する方法は? Python functools.partialオブジェクトによって内部的にカプセル化された元の関数を表示する方法は? Apr 01, 2025 pm 04:15 PM

python functools.partialオブジェクトのpython functools.partialを使用してPythonを使用する視聴方法を深く探索します。

Pythonクロスプラットフォームデスクトップアプリケーション開発:どのGUIライブラリが最適ですか? Pythonクロスプラットフォームデスクトップアプリケーション開発:どのGUIライブラリが最適ですか? Apr 01, 2025 pm 05:24 PM

Pythonクロスプラットフォームデスクトップアプリケーション開発ライブラリの選択多くのPython開発者は、WindowsシステムとLinuxシステムの両方で実行できるデスクトップアプリケーションを開発したいと考えています...

あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? Apr 01, 2025 pm 11:15 PM

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

See all articles