Python开发 —— 变量、全局变量&函数的参数传递

1. Python变量

1.1 变量的定义和使用

在Python中,变量不需要显式声明。通过赋值语句,变量会自动创建。例如:

python 复制代码
x = 10
y = "Hello, World!"

在这段代码中,`x` 被赋值为整数10,而 `y` 被赋值为字符串 "Hello, World!"。

1.2 变量的类型

Python 是一种动态类型语言,这意味着变量的类型是在赋值时确定的,并且同一变量可以在程序的不同部分保存不同类型的值。例如:

python 复制代码
x = 10
print(type(x))  # 输出 <class 'int'>
x = "Hello"
print(type(x))  # 输出 <class 'str'>

1.3 变量的作用域

变量的作用域决定了变量在程序中的可访问范围。Python 主要有以下两种作用域:

局部变量:在函数内部定义,只在函数内部有效。

全局变量:在函数外部定义,可以在整个程序中访问。例如:

python 复制代码
global_var = "I am a global variable"

def my_function():
    local_var = "I am a local variable"
    print(global_var)  # 可以访问全局变量
    print(local_var)   # 可以访问局部变量

my_function()
print(local_var)  # 会报错,因为 local_var 只在函数内部有效

2. Python的参数传递

2.1 不可变对象(不可变数据类型)

不可变对象包括整数、浮点数、字符串和元组。这些对象在函数中被修改时,会生成新的对象,原对象保持不变。例如:

python 复制代码
def add_one(num):
    num += 1
    return num

a = 5
print(add_one(a))  # 输出 6
print(a)           # 输出 5,a 的值没有被修改

在这个例子中,`num += 1` 创建了一个新的整数对象,而 `a` 的值没有改变。

2.2 可变对象(可变数据类型 )

可变对象包括列表、字典和集合。这些对象在函数中被修改时,会影响到函数外的对象。例如:

python 复制代码
def append_one(lst):
    lst.append(1)

my_list = [0]
append_one(my_list)
print(my_list)  # 输出 [0, 1]

在这个例子中,lst.append(1) 修改了 `my_list` 的内容,因为 `lst` 和 `my_list` 引用的是同一个对象。

3. 开发出现的问题

python 复制代码
def logic_data_record(folder_num):
    folder_num += 1
    return folder_num


folder_num = 0
while True:
    result = logic_data_record(folder_num)
    print(result)

在代码中,`folder_num` 被作为参数传递给 `logic_data_record` 函数,并在函数内部的执行过程中递增。然而,每次调用该函数时,都从外部的 `while` 循环传递相同的初始值 `0` 给该函数,这导致每次调用函数时 `folder_num` 都被重新初始化为 `0`。

4. 解决方法1------使用 global

为了在函数中修改全局变量,需要使用 `global` 关键字声明该变量是全局的。这使得函数内部对该变量的修改会影响到全局作用域中的变量。

4.1 代码示例

python 复制代码
folder_num = 0  # 定义全局变量

def logic_data_record():
    global folder_num  # 声明使用全局变量
    folder_num += 1  # 修改全局变量
    return folder_num

while True:
    result = logic_data_record()  # 调用函数,递增 folder_num
    print(result)  # 输出递增后的值

4.2 详细解释

4.2.1 定义全局变量

python 复制代码
folder_num = 0

folder_num 是一个全局变量,初始值为0。

4.2.2 声明使用全局变量

python 复制代码
def logic_data_record():
    global folder_num  # 声明 folder_num 为全局变量
    folder_num += 1  # 修改全局变量
    
    return folder_num

在 logic_data_record 函数中,使用 global folder_num 声明 folder_num 是全局变量。这样,函数内对 folder_num 的修改会影响到全局范围内的 folder_num。

4.2.3 循环调用函数

python 复制代码
while True:
    result = logic_data_record()  # 调用函数,递增 folder_num
    print(result)  # 输出递增后的值

在 `while` 循环中,每次调用 `logic_data_record` 函数,`folder_num` 都会递增,并将递增后的值打印出来。

通过这种方式,每次循环时 `folder_num` 的值都会递增,并且变化会在全局范围内生效。

5. 解决方法2

为了让 `folder_num` 能够持续递增,需要将递增后的 `folder_num` 值返回给 `while` 循环,并使用这个返回值更新外部的 `folder_num` 变量。这样,每次循环时传递给函数的 `folder_num` 值都会是最新的递增值。

可以修改 `logic_data_record` 函数,使其在最后返回更新后的 `folder_num` 值。然后在 `while` 循环中使用这个返回值来更新外部的 `folder_num` 变量。以下是代码示例:

python 复制代码
def logic_data_record(folder_num):
    folder_num += 1
    return folder_num


folder_num = 0
while True:
    folder_num = logic_data_record(folder_num)
    print(folder_num)

通过这种方式,每次函数调用后都会递增 `folder_num`,并将新值传回主循环,使得下一次函数调用时使用的是递增后的值。这样就可以确保 `folder_num` 在每次迭代中都是增加的。

相关推荐
唐家小妹2 分钟前
介绍一款开源的 Modern GUI PySide6 / PyQt6的使用
python·pyqt
XKSYA(小巢校长)32 分钟前
NatGo我的世界联机篇
开发语言·php
羊小猪~~33 分钟前
深度学习项目----用LSTM模型预测股价(包含LSTM网络简介,代码数据均可下载)
pytorch·python·rnn·深度学习·机器学习·数据分析·lstm
Cons.W35 分钟前
Codeforces Round 975 (Div. 1) C. Tree Pruning
c语言·开发语言·剪枝
憧憬成为原神糕手38 分钟前
c++_ 多态
开发语言·c++
VBA633738 分钟前
VBA信息获取与处理第三个专题第三节:工作薄在空闲后自动关闭
开发语言
Marst Code1 小时前
(Django)初步使用
后端·python·django
985小水博一枚呀1 小时前
【对于Python爬虫的理解】数据挖掘、信息聚合、价格监控、新闻爬取等,附代码。
爬虫·python·深度学习·数据挖掘
立秋67891 小时前
Python的defaultdict详解
服务器·windows·python
wjs20241 小时前
XSLT 实例:掌握 XML 转换的艺术
开发语言