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` 在每次迭代中都是增加的。

相关推荐
databook9 小时前
Manim实现闪光轨迹特效
后端·python·动效
Juchecar10 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户83562907805110 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_10 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机17 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机18 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机18 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机18 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i18 小时前
drf初步梳理
python·django
每日AI新事件18 小时前
python的异步函数
python