此代码运行没有错误。但是在函数find_available_filenumber
中,未声明变量render_folder
。所以我的问题是为什么这不会产生错误?
如果我删除full_filename
作为参数,我会收到错误:
UnboundLocalError: local variable 'full_filename' referenced before assignment.
我不明白为什么在我的代码示例中render_folder
也不会发生这种情况:
import bpy
import os
#Functions
def find_available_filenumber(full_filename):
file_number = 1
while os.path.exists(render_folder + "\\" + full_filename):
file_number += 1
full_filename = create_full_filename(filename, file_number)
return file_number
def create_full_filename(filename, file_number):
file_extension = ".avi"
full_filename = filename + "_" + str(file_number) + file_extension
return full_filename
#Paths and names
project_folder = "F:\\06_MotionPath_Dev\\"
os.chdir(project_folder)
render_folder = "Render\\QuickRenderAddon"
filename = bpy.context.scene.name #Returns "QuickRenderAddon"
full_filename = create_full_filename(filename, 1)
filepath = render_folder + "\\" + full_filename
available_number = find_available_filenumber(full_filename)
print("Avail nmb: " + str(available_number))
答案 0 :(得分:3)
啊是经典"在作业之前参考"
我写了一些示例代码来显示正在发生的事情。
test = "toast!"
toast = "test!"
def func():
print test
print toast
func()
以上的输出是
toast!
test!
这表明我们可以读取全局变量,但是写入它们呢?我不想要'吐司'要测试!'不再,而是面包+烤面包机!'。让我们写出来。
test = "toast!"
toast = "test!"
def func():
print test
toast = "bread+toaster!"
print toast
func()
print toast
此输出
toast!
bread+toaster!
test!
您会注意到我们能够打印本地分配的变量,但全局变量没有变化。现在,让我们看看另一个例子。
test = "toast!"
toast = "test!"
def func():
print test
print toast
toast = "bread+toaster!"
print toast
func()
print toast
这将抛出错误
UnboundLocalError: local variable 'toast' referenced before assignment
为什么呢?因为您之后宣布了您的变量“吐司”'作为局部变量。 Python注意到这一点并停止代码以防止错误。你设置了'吐司'后来不是改变全局变量,而是在名为' toast'的函数中声明一个本地变量。
你怎么解决这个问题?
第一个是在函数中添加一个全局子句
test = "toast!"
toast = "test!"
def func():
global toast
print test
print toast
toast = "bread+toaster!"
print toast
func()
print toast
此输出
toast!
test!
bread+toaster!
bread+toaster!
您也可以将代码修改为类结构。
class bread():
def __init__(self):
self.test = "toast!"
self.toast = "test!"
def func(self):
print self.test
print self.toast
self.toast = "bread+toaster!"
print self.toast
b = bread()
b.func()
在我看来,课程是最好的解决方案,因为它会增加模块化并帮助您减少意大利面条代码。
答案 1 :(得分:1)
编辑:忽略我,我正在移动,所以我没有正确阅读。
错误表示“在分配前引用”。换句话说,在为其写入值之前,您正尝试从该变量中读取值。
我觉得这个错误是在你的while条件中造成的,因为你在while循环体内写入它之前检查了它。
答案 2 :(得分:1)
此代码运行没有错误。但是在函数find_available_filenumber中,未声明变量render_folder。所以我的问题是为什么这不会产生错误?
这是因为render_folder
在调用find_available_filenumber
时被声明,即使在定义函数时未声明它。